PL/SQL এ Exception Handling হল এমন একটি প্রক্রিয়া যার মাধ্যমে কোডে কোনো ত্রুটি (error) ঘটলে, সেই ত্রুটিকে ধরার জন্য নির্দিষ্ট নিয়ম ও পদ্ধতি ব্যবহার করা হয়। Exception Logging হল ত্রুটির তথ্য লগ করা, যাতে ভবিষ্যতে সেই ত্রুটির বিশ্লেষণ করা এবং সমস্যা সমাধান করা সহজ হয়।
PL/SQL তে Exception Handling এবং Logging ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনটির স্থিতিশীলতা এবং ডিবাগিং ক্ষমতা বৃদ্ধি করা যায়।
Exception Handling in PL/SQL
PL/SQL এ exception handling তিনটি প্রধান অংশে বিভক্ত:
- Predefined Exceptions: Oracle দ্বারা নির্ধারিত কিছু সাধারণ ত্রুটি।
- User-defined Exceptions: ব্যবহারকারীর তৈরি করা ত্রুটি।
- Exception Handling Block: যেখানে exception গুলি ধরার এবং তাদের সমাধান করার জন্য কোড লেখা হয়।
Predefined Exceptions
Oracle অনেক predefined exceptions প্রদান করে, যা সাধারণ ত্রুটিগুলি ধরতে ব্যবহৃত হয়। উদাহরণস্বরূপ:
- NO_DATA_FOUND: যখন SELECT স্টেটমেন্ট কোনো ডাটা না পায়।
- TOO_MANY_ROWS: যখন SELECT স্টেটমেন্ট অনেকগুলো রেকর্ড ফিরিয়ে দেয়।
- ZERO_DIVIDE: যখন কোনো সংখ্যা শূন্য দিয়ে ভাগ করার চেষ্টা করা হয়।
User-defined Exceptions
ব্যবহারকারীর তৈরি ত্রুটি, যেগুলি PL/SQL ব্লকে নির্দিষ্ট পরিস্থিতির ভিত্তিতে তৈরি করা হয়।
Exception Handling Block
PL/SQL ব্লকের EXCEPTION অংশে ত্রুটির ধরন উল্লেখ করে সেই ত্রুটির জন্য নির্দিষ্ট সমাধান দেওয়া হয়।
PL/SQL Exception Handling এর উদাহরণ
DECLARE
num1 NUMBER := 10;
num2 NUMBER := 0;
result NUMBER;
BEGIN
-- Arithmetic operation that may cause divide by zero exception
result := num1 / num2;
EXCEPTION
-- Handling predefined exception for division by zero
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Error: Cannot divide by zero!');
-- Handling other exceptions
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;
Explanation:
- এখানে একটি ডিভাইড বাই জিরো (divide by zero) ত্রুটি ঘটে, যার ফলে
ZERO_DIVIDEexceptionটি ধরা হয় এবংError: Cannot divide by zero!মেসেজ প্রিন্ট হয়। OTHERSexception দ্বারা অন্য কোনো ত্রুটি (যেমন, SQL ত্রুটি) ধরতে সক্ষম হবে এবং তার বিশদ ত্রুটির বার্তা দেখাবে।
Exception Logging
Exception logging হল ত্রুটির তথ্য ডাটাবেসে বা লগ ফাইলে সংরক্ষণ করার প্রক্রিয়া, যা পরে বিশ্লেষণ করা এবং সমস্যার সমাধান করার জন্য ব্যবহৃত হতে পারে।
Exception Logging with DBMS_UTILITY and DBMS_OUTPUT
একটি লগ টেবিল ব্যবহার করে exception লগিং করা যেতে পারে, যাতে ত্রুটির বিস্তারিত তথ্য সংরক্ষিত থাকে। যেমন, ত্রুটি কোড, ত্রুটির বার্তা, এবং ত্রুটি হওয়ার সময়ের তথ্য।
Exception Logging এর উদাহরণ
DECLARE
num1 NUMBER := 10;
num2 NUMBER := 0;
result NUMBER;
BEGIN
-- Arithmetic operation that may cause divide by zero exception
result := num1 / num2;
EXCEPTION
WHEN ZERO_DIVIDE THEN
-- Logging the error in a database table
INSERT INTO error_log (error_code, error_message, error_time)
VALUES (SQLCODE, SQLERRM, SYSDATE);
DBMS_OUTPUT.PUT_LINE('Error: Cannot divide by zero!');
WHEN OTHERS THEN
-- Logging any other errors in the error_log table
INSERT INTO error_log (error_code, error_message, error_time)
VALUES (SQLCODE, SQLERRM, SYSDATE);
DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;
Explanation:
- যখন
ZERO_DIVIDEexception ঘটে, ত্রুটির কোড, বার্তা এবং সময়error_logটেবিলে ইনসার্ট করা হয়। - অন্য কোনো ত্রুটি ঘটলে,
OTHERSexception দ্বারা তা ধরিয়ে তার বিস্তারিত তথ্য লগে জমা করা হয়।
SQLERRM এবং SQLCODE
- SQLERRM: এটি একটি সিস্টেম ফাংশন যা বর্তমান ত্রুটির বার্তা (error message) প্রদান করে।
- SQLCODE: এটি একটি সিস্টেম ফাংশন যা বর্তমান ত্রুটির কোড (error code) প্রদান করে।
উপরের উদাহরণে, SQLERRM এবং SQLCODE ব্যবহার করা হয়েছে ত্রুটির বিশদ বিবরণ রেকর্ড করার জন্য।
RAISE এবং RAISE_APPLICATION_ERROR
- RAISE: ব্যবহৃত হয় user-defined exceptions বা সাধারণ exceptions পুনরায় ট্রিগার করার জন্য।
- RAISE_APPLICATION_ERROR: এটি বিশেষত ব্যবহারকারীর তৈরি ত্রুটি কোড এবং বার্তা প্রদান করার জন্য ব্যবহৃত হয়।
RAISE এবং RAISE_APPLICATION_ERROR এর উদাহরণ
DECLARE
v_balance NUMBER := 1000;
BEGIN
-- Simulate a condition where balance is insufficient
IF v_balance < 500 THEN
RAISE_APPLICATION_ERROR(-20001, 'Insufficient balance');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
Explanation:
- যদি ব্যালেন্স 500 এর কম থাকে, তবে
RAISE_APPLICATION_ERRORদ্বারা একটি ত্রুটি কোড-20001এবং একটি কাস্টম বার্তা 'Insufficient balance' তৈরি করা হয়। - এই ত্রুটির বিবরণ
SQLERRMএর মাধ্যমে ধরা হয় এবং প্রিন্ট করা হয়।
Best Practices for Exception Handling and Logging
- Handle Specific Exceptions First: সর্বদা
WHEN ... THENব্লক ব্যবহার করে স্পেসিফিক ত্রুটির জন্য আলাদা সমাধান প্রদান করুন। সাধারণ ত্রুটিগুলোর জন্যOTHERSব্যবহার করুন। - Log Errors with Detailed Information: ত্রুটির বার্তা, কোড, সময় এবং অন্যান্য গুরুত্বপূর্ণ তথ্য লগ ফাইলে সংরক্ষণ করুন।
- Raise Appropriate Errors: যখন নির্দিষ্ট পরিস্থিতি পূর্ণ হয়, তখন
RAISE_APPLICATION_ERRORব্যবহার করে কাস্টম ত্রুটি তৈরি করুন। - Use SQLERRM and SQLCODE for Error Details:
SQLERRMএবংSQLCODEব্যবহার করে ত্রুটির বিস্তারিত তথ্য সংগ্রহ করুন। - Ensure Proper Cleanup: যখন একটি ত্রুটি ঘটে, তবুও প্রয়োজনীয় পরিষ্কার-পরিচ্ছন্নতা (cleanup) কার্যক্রম সম্পন্ন করতে নিশ্চিত হন (যেমন ট্রানজেকশন রোলব্যাক, লগ লেখা ইত্যাদি)।
Conclusion
PL/SQL তে Exception Handling এবং Logging অত্যন্ত গুরুত্বপূর্ণ বিষয়। Exception handling দ্বারা ত্রুটি হ্যান্ডলিং, কোডের স্থিতিশীলতা এবং সঠিক ফলাফল নিশ্চিত করা হয়। Exception Logging ব্যবহার করে ত্রুটির তথ্য সংরক্ষণ করা যায়, যা পরবর্তীতে সমস্যা সমাধান এবং ডিবাগিংয়ের কাজে আসে। Proper exception handling practices কোডের গুণমান বৃদ্ধি করে এবং ভবিষ্যতে ত্রুটির কারণ শনাক্ত করা সহজ করে।